package cn.tedu.task2;

import javax.swing.*;
import java.awt.*;
import java.util.Random;

/**
 * @description: 所有海洋目标的超类
 * @author: Zane Zhang
 * @create: 2022-09-08 17:02
 **/
public abstract class SeaObject {
    //1.表示游戏中对象的当前状态（默认是活着的）//用下面的常量0和1来给状态 state赋值
    private int state = LIVE;
    public static final int LIVE = 0;//活着的
    public static final int DEAD = 1;//死了的

    //2.表示游戏中对象的宽高，xy坐标，移动速度变量
    protected int width;//宽
    protected int height;//高
    protected int x;//x坐标
    protected int y;//y坐标
    protected int speed;//速度

    //3.用来给游戏中的潜艇(侦察艇 鱼雷潜艇 水雷潜艇)各个属性(成员变量)赋值
    //专门给侦查潜艇 鱼雷潜艇 水雷潜艇提供的,因为三种潜艇的宽和高不一样,所以数据不能写死,需传参写活
    //三种潜艇的 x y speed 是一样的,所以数据可以写死,不需要传参

    /**
     * 专门给侦察潜艇、鱼雷潜艇、水雷潜艇提供的构造方法
     */
    public SeaObject(int width, int height) {
        this.width = width;
        this.height = height;
        x = -width;//todo
        Random rand = new Random();
        y = rand.nextInt(World.HEIGHT - height - 150 + 1) + 150;//150到(窗口高-潜艇高)之间的随机数
        speed = rand.nextInt(3) + 1;//1-3之间的随机数


    }

    //4.用来给游戏中的战舰 水雷 深水炸弹各个属性(成员变量)赋值
    //专门给战舰 水雷 深水炸弹提供的  因为三种潜艇的宽和高不一样,所以数据不能写死,需传参写活

    /**
     * 专门给战舰、水雷、炸弹提供的构造方法
     */
    public SeaObject(int width, int height, int x, int y, int speed) {
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }


    /**
     * 移动
     */
    //6海洋对象移动
    public abstract void move();

    /**
     * 获取对象的图片
     */
    //7.获取对象的图片
    public abstract ImageIcon getImage();

    /**
     * 判断对象是否是活着的
     */
    //8判断是否是活着的
    public boolean isLive() {
        return state == LIVE; //如果当前状态为 LIVE,表示为活着的,返回 true,否则返回 false
    }

    /**
     * 判断对象是否是死了的
     */
    //9判断是否是死的
    public boolean isDead() {
        return state == DEAD; //如果当前状态为 DEAD,表示死了的,返回 true,否则返回 false
    }

    /**
     * 检测潜艇是否越界
     *
     * @return 若越界则返回true，否则返回false
     */
    //10检测潜艇是否越界
    public boolean isOutOfBounds() {
        return x >= World.WIDTH;//潜艇的x>=窗口的宽,即为越界
    }

    /**
     * 检测碰撞
     *
     * @param other 另一个对象  this表示一个对象
     * @return 若撞上了则返回true，否则返回false
     */
    //11检测碰撞 this:当前对象 other:另一个对象
    public boolean isHit(SeaObject other) {
        //假设:指代潜艇,other指代炸弹
        int x1 = this.x - other.width;//x1:潜艇的x-炸弹的宽
        int x2 = this.x + this.width;//x2:潜艇的 x+潜艇的宽
        int y1 = this.y - other.height;//y1:潜艇的 y-炸弹的高
        int y2 = this.y + this.height;//y2:潜艇的 y+潜艇的高
        int x = other.x;
        int y = other.y;
        return x > x1 && x <= x2 && y >= y1 && y <= y2;//x 在x1与 x2之间,并且y 在 y1与 y2之间,即为撞上了

    }

    /**
     * 海洋对象去死
     */
    //12海洋对象去死
    public void goDead() {
        state = DEAD;//将对象状态修改为 DEAD死了的
    }

    /**
     * 画对象
     *
     * @param g 画笔
     */
    public void paintImage(Graphics g) {
        if (this.isLive()) {
            this.getImage().paintIcon(null, g, this.x, this.y);
        }

    }
}

